package org.example.day01;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * 给你一个字符串 s，字符串s首尾相连成一个环形 ，请你在环中找出 'o' 字符出现了偶数次最长子字符串的长度
 * @date 2024/3/11 15:22
 */
public class test013 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String[] bricksInput = scanner.nextLine().split(" ");
        int[] bricks = Arrays.stream(bricksInput).mapToInt(Integer::parseInt).toArray();
        int hours = 8;

        System.out.println(findMinEnergy(bricks, hours));
        scanner.close();
    }

    // 检查给定的能量是否足以让机器人在规定时间内搬运所有砖块
    private static boolean canComplete(int[] bricks, int energy, int hours) {
        int totalHours = 0; // 总共需要的小时数
        for (int brick : bricks) {
            totalHours += Math.ceil((double)brick / energy); // 使用 Math.ceil 实现天花板除法，计算每堆砖块需要的小时数
        }
        return totalHours <= hours; // 如果总小时数小于等于规定时间，则返回 true
    }

    // 使用二分查找方法找到机器人搬运所有砖块所需的最小能量值
    private static int findMinEnergy(int[] bricks, int hours) {
        int left = 1, right = Arrays.stream(bricks).max().getAsInt(); // 设定二分查找的范围
        while (left < right) {
            int mid = (left + right) / 2; // 计算中间值
            if (canComplete(bricks, mid, hours)) {
                right = mid; // 如果可以完成，则尝试更小的能量值
            } else {
                left = mid + 1; // 如果不能完成，则需要更大的能量值
            }
        }
        return canComplete(bricks, left, hours) ? left : -1; // 检查最终的左边界值是否有效，无效则返回-1
    }
}




